﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;

namespace TratamentoRIWikipedia.processamento
{
    class Stopwords
    {
        /// <summary>
        /// Monta uma lista de Ocorrencias
        /// </summary>
        /// <param name="valor"></param>
        /// <returns></returns>
        public static Dictionary<string, int> MontaListaOcorrencia(StreamReader arq)
        {
            Dictionary<string, int> listOcorre = new Dictionary<string, int>();

            try
            {
                //lendo a linha 
                string LinhaTxt = arq.ReadLine();

                while (LinhaTxt != null)
                {

                    string[] stringSeparators = new string[] { " ", "/n" }; //"<#separador#>",
                    ArrayList palavras = new ArrayList(LinhaTxt.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries));

                    foreach (string item in palavras)
                    {
                        //Se o item ainda não existe na lista adiciona
                        if (!listOcorre.ContainsKey(item))
                            listOcorre.Add(item, 1);
                        else
                        {
                            int frequencia = listOcorre[item];
                            listOcorre[item] = frequencia + 1;
                        }

                    }
                    //lendo a linha 
                    LinhaTxt = arq.ReadLine();
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            return (listOcorre);
        }



        /// <summary>
        /// Lei de Zif - Calcula media
        /// </summary>
        /// <param name="valor"></param>
        /// <returns></returns>
        public static ArrayList LeiZif(Dictionary<string, int> listOcorre)
        {
            ArrayList listStopWords = new ArrayList();

            double soma = 0;
            double media = 0;


            //soma o valor de todas as chaves 
            foreach (KeyValuePair<string, int> pair in listOcorre)
            {
                soma = soma + pair.Value;
            }

            //calcula Media
            media = soma / listOcorre.Count;

            //Verifica se é stop word
            foreach (KeyValuePair<string, int> pair in listOcorre)
            {
                if (pair.Value >= media)
                    listStopWords.Add(pair.Key);
            }

            return (listStopWords);
        }


        /// <summary>
        /// Elimina StopWords
        /// </summary>
        /// <param name="valor"></param>
        /// <returns></returns>
        public static void RemoveStopWords(StreamReader arquivo, ArrayList listStopWord)
        {
            try
            {
                //Arquivo sem stop words
                StreamWriter ArquivoSemStopWord = new StreamWriter("WikiDocSemStopWord.txt");

                //lendo a linha 
                string LinhaTxt = arquivo.ReadLine();
                while (LinhaTxt != null)
                {
                    string[] stringSeparators = new string[] { "<#title#>", "<#id#>", "<#text#>" };//  "<#separador#>"
                    //split com a string acima 
                    ArrayList palavras = new ArrayList(LinhaTxt.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries));

                    
                    ArquivoSemStopWord.Write("<#title#>" + palavras[0]);
                    ArquivoSemStopWord.Write("<#id#>" + palavras[1]);
                    ArquivoSemStopWord.Write("<#text#>" );

                    string[] itemTexto = palavras[2].ToString().Split(' ');
                    for (int i = 0; i < (itemTexto.Length); i++)
                    {
                        if (i > 2 && !listStopWord.Contains(itemTexto[i]))
                            ArquivoSemStopWord.Write(itemTexto[i] + " ");                          
                    }

                    ArquivoSemStopWord.WriteLine();//Nova 
                    LinhaTxt = arquivo.ReadLine();//lendo nova linha 
                }

                ArquivoSemStopWord.Close();
            }
            catch (Exception e)
            {
                throw e;
            }

         
        }
    }
}
